#include "TraitementInfosBd.h"


/*************************************************************************
                        ReceptionInfosProxy  -  description
                             -------------------

*************************************************************************/

//---- Réalisation de la tâche <ReceptionInfosProxy> (fichier ReceptionInfosProxy.cpp) ---



//------------------------------------------------------ Fonctions privées
 void TraitementInfosBdInit()
{

}

void TraitementInfosBdMoteur(int balInfo)
{
	while(1)
	{
		MsgInformation msgInfo;
		int ctrl;
		long longueur;
		printf("[TraitementInfosBd] En attente de réception de message...\n");
		ctrl = msgrcv(balInfo,&msgInfo,sizeof(msgInfo),longueur,0); //attente d'informations à stocker dans la bdd
		if(ctrl == -1)
		{
			perror("[TraitementInfosBd] Erreur de réception du message de la boite aux lettres\n");
			switch(errno)
			{
				case E2BIG : perror("[TraitementInfosBd] Erreur : E2BIG\n"); break;
				case EACCES : perror("[TraitementInfosBd] Erreur : EACCESS\n"); break;
				case EIDRM : perror("[TraitementInfosBd] Erreur : EACCESS\n"); break;
				case EINTR : perror("[TraitementInfosBd] Erreur : EACCESS\n"); break;
				case EINVAL : perror("[TraitementInfosBd] Erreur : EACCESS\n"); break;
				case ENOMSG : perror("[TraitementInfosBd] Erreur : EACCESS\n"); break;
				case EFAULT : perror("[TraitementInfosBd] Erreur : EACCESS\n"); break;
			}
			exit(1);
		}
		else
		{
			printf("[TraitementInfosBd] Message recu : %s\n",msgInfo.info.date);
			printf("[TraitementInfosBd] ID capteur : %s\n",msgInfo.info.idCapteur);


			/*//test
			char date[20] = "2010-12-05 13:05:03";
			char capteur[3] = "3";
			char valeur[20] = "1.3";

			Information info;

			strcpy(msgInfo.info.date, date);
			strcpy(msgInfo.info.idCapteur, capteur);
			strcpy(msgInfo.info.valeur, valeur);*/

			MYSQL *mysql;
			MYSQL_RES *result;
			MYSQL_ROW row;
			int num_fields;

			mysql = mysql_init(NULL);
			printf("[TraitementInfosBd] Tentative de connexion à la BDD\n");

			//Connexion à la BDD
			if (mysql_real_connect(mysql, MYSQL_HOST, MYSQL_LOGIN, MYSQL_PASSWD, MYSQL_DB, 0, NULL, 0) == NULL) {
				printf("[TraitementInfosBd] Erreur de connexion à la BDD : %s\n", mysql_error(mysql));
				mysql_close(mysql);
				exit(1);
			}
			if (mysql_select_db(mysql,MYSQL_DB) == 0)
			{

				printf("[TraitementInfosBd] Connecté à la BDD!\n");

				char requeteBDD0[200] = "SELECT idSource FROM source WHERE identifiantCapteur='";
				sprintf(requeteBDD0, "%s%s%s", requeteBDD0, msgInfo.info.idCapteur, "';");
				printf("[TraitementInfosBd] %s\n", requeteBDD0);
				//TODO : obtenir idSource et l'utiliser dans requeteBDD à la place de msgInfo.info.idCapteur
				if(mysql_query(mysql, requeteBDD0))
				{
					printf("[TraitementInfosBd] Erreur requête\n");
					printf("[TraitementInfosBd] Fermeture de la connexion\n");
					mysql_close(mysql);
				}
				else
				{
					result = mysql_store_result(mysql);
					if(result)
					{
						num_fields = mysql_num_fields(result);
						printf("Num_fields : %i", num_fields);
						row = mysql_fetch_row(result);
						printf("[TraitementInfosBd] row[0] : %s", row[0]);
						int idSource = atoi(row[0]); //la conversion peut poser problème
						mysql_free_result(result);
						printf("[TraitementInfosBd] idSource : %i\n", idSource);

						char requeteBDD[] = "INSERT INTO mesure(idSource,valeurMesure,dateMesure) VALUES (";
						sprintf(requeteBDD, "%s%i%s%s%s%s%s", requeteBDD, idSource, ",", msgInfo.info.valeur, ",'", msgInfo.info.date, "');");
						printf("[TraitementInfosBd] %s\n", requeteBDD);

						//enregistrement des informations dans la base de données
						mysql_query(mysql, requeteBDD);
						printf("[TraitementInfosBd] Fermeture de la connexion\n");
						mysql_close(mysql);
						char descrp[] = "données du proxy insérées en base de données par le serveur";
						logEvent(1 ,descrp);
					}
					else
					{
						if (mysql_errno(&mysql))
						{
							fprintf(stderr, "[TraitementInfosBd] Erreur: %s\n", mysql_error(&mysql));
							printf("[TraitementInfosBd] Fermeture de la connexion\n");
							mysql_close(mysql);
						}
						else if (mysql_field_count(&mysql) == 0)
						{
							perror("[TraitementInfosBd] Erreur: aucun capteur n'a été trouvé\n");
							printf("[TraitementInfosBd] Fermeture de la connexion\n");
							mysql_close(mysql);
							char descrp[] = "tentative d'insertion de données pour un capteur inexistant en BBD par le serveur";
							logEvent(1 ,descrp);
						}
					}
				}
			}
			else {
				perror("[TraitementInfosBd] Erreur de connexion à la BDD!\n");
				exit(1);
			}
		}
	}
}

//////////////////////////////////////////////////////////////////  PUBLIC
//---------------------------------------------------- Fonctions publiques
void TraitementInfosBd(void* bal)
{
	int balInfo = (int)bal;
	printf("[TraitementInfosBd] Thread TraitementInfosBd démarré. Ecoute sur la BaL %i\n", balInfo);
	TraitementInfosBdMoteur(balInfo);
}

